﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using System.Web.UI;
using BookStore.Models;
using System.Data;
namespace BookStore.Controllers
{

    [HandleError]
    public class AccountController : Controller
    {
       
        // view đang ki
        public ActionResult Register()
        {
            if (Session["Session_User"] != null)
            {
                // chuyen den trang logon
                Response.Redirect("/home/index");
            }
            ViewData["phone"] = "";
            ViewData["cmnd"] = "";
            ViewData["address"] = "";
            if (this.Request.Form.Count != 0)
            {
                UsersModel tbAccount = new UsersModel();
                Random ran = new Random();
                int giatri=0;
                string check = "";
                int n = 10000;
                string value = ran.Next(n).ToString();

                string[] temp = new string[11];
                temp[0] = Server.HtmlEncode(this.Request.Form["username"]);
                temp[1] = Utils.GetMD5Hash(Server.HtmlEncode(this.Request.Form["password"]));
                temp[2] = Server.HtmlEncode(this.Request.Form["address"]);
                temp[5] = Server.HtmlEncode(this.Request.Form["phone"]);
                temp[4] = Server.HtmlEncode(this.Request.Form["cmnd"]);
                temp[3] = Server.HtmlEncode(this.Request.Form["email"]);
                temp[6] = Server.HtmlEncode(this.Request.Form["username"]);
                temp[7] = Utils.Now().ToString(); // create date
                temp[8] = Utils.Now().ToString(); // update date
                temp[9] = "0"; // active
                temp[10] = Utils.GetMD5Hash(value); // active code
                check = tbAccount.Check_Account(temp).ToString();
                if (check == "1")
                {
                        giatri = tbAccount.Add_Account(temp);
                        string[] session_temp = new string[4];
                        session_temp[0] = Server.HtmlEncode(this.Request.Form["username"]);
                        session_temp[1] = Server.HtmlEncode(this.Request.Form["password"]);
                        session_temp[2] = Server.HtmlEncode(this.Request.Form["email"]);
                        session_temp[3] = Utils.GetMD5Hash(value);
                        this.Session["Temp_User"] = session_temp;
                        Response.Redirect("/account/success?method=register");
                }
                else
                {
                    ViewData["phone"] = temp[5];
                    ViewData["cmnd"] = temp[4];
                    ViewData["address"] = temp[2];
                    
                    if (check == "-1")
                    {
                        ViewData["error"] = "Tên Đăng Nhập đã được sử dụng";
                    }
                    else if (check == "-2")
                    {
                        ViewData["error"] = "Email đã được sử dụng";
                    }
                    else if (check == "-3")
                    {
                        ViewData["error"] = "Hệ thống đang bận. vui lòng trở lại sau";
                    }
                }
            }
            return View();
            
        }
        
        // check validate and insert user database
        public ActionResult JsonCheckRegister(string username, string email)
        {
            UsersModel tbAccount = new UsersModel();
            Random ran = new Random();

                int n = 10000;
                string value = ran.Next(n).ToString();
                string giatri = null;

                string[] temp = new string[11];
                temp[0] = username;
                temp[1] = email;
 
                giatri = tbAccount.Check_Account(temp).ToString();

                return Content(giatri);
        }
        
        // view edit user
        public ActionResult EditUser()
        {
            UsersModel tbAccount = new UsersModel();

            if (Session["Session_User"] == null) Response.Redirect("/home/index");
            if (this.Request.Form.Count != 0)
            {

                string giatri = null;
                string[] temp = new string[5];
                temp[0] = Server.HtmlEncode(this.Request.Form["address"]); ;
                temp[1] = Server.HtmlEncode(this.Request.Form["phone"]);
                temp[2] = Server.HtmlEncode(this.Request.Form["cmnd"]);
                temp[3] = Server.HtmlEncode(this.Request.Form["email"]);
                temp[4] = Utils.Now().ToString(); // update date
               
                giatri = tbAccount.Check_Edit_Account(Convert.ToInt32(Session["Session_User"].ToString()),  temp[3]).ToString();
                if(giatri=="1")
                {
                    tbAccount.Edit_Account(Convert.ToInt32(Session["Session_User"].ToString()), temp).ToString();
                    ViewData["success"] = "Hệ thống đã cập nhật thành công";
                }
                else
                {
                   
                      if (giatri == "-2")
                       {
                           ViewData["error"] = "Email đã có người sử dụng";
                       }
                       else if (giatri == "-3")
                       {
                           ViewData["error"] = "Hệ thống đang bận. vui lòng trở lại sau";
                       }
                }
   
            }
            if (Session["Session_User"] != null)
            {
                int id = Convert.ToInt32(Session["Session_User"].ToString());
                string[] result = new string[5];
                result = tbAccount.getDetailUserById(id);
                if (result == null) return RedirectToAction("Index", "Home");
                ViewData["email"] = result[0];
                ViewData["phone"] = result[1];
                ViewData["cmnd"] = result[2];
                ViewData["address"] = result[3];
                ViewData["user_name"] = result[4];


            }
            else Response.Redirect("/home/index");
           
            return View();
        }
        
        // check validate and update edit user
        public ActionResult JsonCheckEditUser(string email)
        {
            UsersModel tbAccount = new UsersModel();

            if(Session["Session_User"]!=null)
            {
                string giatri = null;
                giatri = tbAccount.Check_Edit_Account(Convert.ToInt32(Session["Session_User"].ToString()),email).ToString();
                return Content(giatri);
            }
            return Content("1");
        }
       
        // success , direct to
        public ActionResult Success()
        {
            
            SendMail mail = new SendMail();
         
            if (this.Request.QueryString["method"] != null)
            {
                if (this.Session["Temp_User"] != null)
                {

                    string[] temp = (string[])Session["Temp_User"];
                    string noidung = "Chào mừng bạn đã đến với LEGEND 3STEAM - ASP HTML CSS JAVASCRIPT! <Br>";

                    noidung += "Hãy giữ email này cẩn thận. Thông tin về tài khoản thành viên của bạn như sau: <Br>";
                    noidung += "---------------------------------- <Br>";
                    noidung += "Tên thành viên: " + temp[0] + " <Br>";
                    noidung += "Mật khẩu: " + temp[1] + " <Br>";
                    noidung += "---------------------------------- <Br>";
                    string requested = Request.Url.Host + ":" + Request.Url.Port;
                    switch (this.Request.QueryString["method"])
                    {
                        case "register":
                            ViewData["title"] = "Đăng kí tài khoản";
                            ViewData["success"] = "Tạo tài khoản thành công.Hệ thống đã gửi email với thông tin tài khoản đến email của bạn.Vui lòng <a href='/account/logon'>nhấn vào đây </a> để vào trang đăng nhập ";
                            noidung += "Tài khoản của bạn hiện tại chưa được kích hoạt. Bạn không thể sử dụng tài khoản này để đăng nhập vào hệ thống cho đến khi bạn kích hoạt nó bằng cách bấm vào liên kết dưới đây:<Br> " + requested + "/account/active?id=" + temp[3] + " <Br>";
                            noidung += "Cám ơn bạn đã tham gia cùng với chúng tôi!<Br>";
                            mail.Send(temp[2], "Admin BookStore - Hoàn tất đăng kí", noidung);
                            break;
                        case "forget":

                            ViewData["title"] = "Quên mật khẩu";
                            ViewData["success"] = "Hệ thống đã gửi email với thông tin tài khoản đến email của bạn .Vui lòng <a href='/account/logon'>nhấn vào đây </a> để vào trang đăng nhập ";
                            noidung += "Bạn có thể dùng chức năng  thay đổi mật khẩu tại <a href=\"" + requested + "/account/changepassword\">đây</a><Br>";
                            mail.Send(temp[2], "Admin BookStore - Quên Mật khẩu", noidung);
                            break;
                        case "change":
                            ViewData["title"] = "Thay đổi mật khẩu";
                            ViewData["success"] = "Hệ thống đã thay đổi mật khẩu của bạn thành công .Vui lòng <a href='/home/index\'>nhấn vào đây </a> để vào trang chủ";
                            break;
                        case "edituser":
                            ViewData["title"] = "Sửa thông tin cá nhân";
                            ViewData["success"] = "Hệ thống đã thay đổi thông tin cá nhân của bạn thành công .Vui lòng <a href='/home/index\'>nhấn vào đây </a> để vào trang chủ";
                            break;
                        default: break;
                    }
                }
                else
                {
                    switch (this.Request.QueryString["method"])
                    {
                        case "edituser":
                            ViewData["title"] = "Sửa thông tin cá nhân";
                            ViewData["success"] = "Hệ thống đã thay đổi thông tin cá nhân của bạn thành công .Vui lòng <a href='/home/index\'>nhấn vào đây </a> để vào trang chủ";
                            break;
                        default: break;
                    }
                }
            }
            else Response.Redirect("/home/index");
            return View();
        }
       
        // active
        public ActionResult Active()
        {
            UsersModel tbAccount = new UsersModel();
       
            int dk;
            if (this.Request.QueryString["id"] != null)
            {
                dk=tbAccount.Active_Account(this.Request.QueryString["id"]);
                if(dk==1)
                    ViewData["active"] = 1;
                else
                    ViewData["active"] = 0;
            }   
            else
                ViewData["active"] = 0;

           return View();
           
        }
        
        // view login
        public ActionResult Logon()
        {
            if (Session["Session_User"] != null)
            {
                // chuyen den trang logon
                Response.Redirect("/home/index");
            }
            int temp = 0,dk=0;
            if (this.Request.Form.Count != 0)
            {

               UsersModel tbAccount = new UsersModel();
               string user = Server.HtmlEncode(this.Request.Form["username"]);
               string pass = Server.HtmlEncode(this.Request.Form["password"]);

               temp = tbAccount.Check_User(user);
               if (temp != -1 && temp != -2)
               {
                   dk = tbAccount.Check_Pass(Utils.GetMD5Hash(pass), temp);
                   if (dk == 1)
                   {
                       this.Session["Session_User"] = tbAccount.getUserIDByUserName(user);
                       Response.Redirect("/home/index");
                   }
                   else
                   {
                       if (dk == -1)
                       {
                           ViewData["error"] = "Tên đăng nhập hoặc mật khẩu không đúng";
                       }
                       else if (dk == -2)
                       {
                           ViewData["error"] = "Tài khoản chưa active.Vui lòng kiểm tra email";
                       }
                       else if (dk == -3)
                       {
                           ViewData["error"] = "Tài khoản đã bị khóa.Vui lòng trở lại sau";
                       }
                   }
               }
               else
               {
                   if (temp == -1)
                   {
                       ViewData["error"] = "Tên đăng nhập hoặc mật khẩu không đúng";
                   }
                   else if (temp == -2)
                   {
                       ViewData["error"] = "Tài khoản chưa active.Vui lòng kiểm tra email";
                   }
                   
               }

              
            }
            return View();
        }
        
        // delete session
        public ActionResult Logout()
        {
            if (Session["Session_User"] != null)
            {
                // chuyen den trang logon
                Session.Contents.Remove("Session_User");
            }
            Response.Redirect("/home/index");
            return View();
        }
       
        // view change password
        public ActionResult ChangePassword()
        {
            if (Session["Session_User"] == null)
            {
                // chuyen den trang logon
                Response.Redirect("/home/index");
            }
            if (this.Request.Form.Count != 0)
            {
                UsersModel tbAccount = new UsersModel();
                string old_password = Server.HtmlEncode(this.Request.Form["old_password"]);
                string new_password = Server.HtmlEncode(this.Request.Form["new_password"]);
                string giatri;
                giatri = tbAccount.Check_Change_Password(Convert.ToInt32(Session["Session_User"].ToString()), Utils.GetMD5Hash(old_password), Utils.GetMD5Hash(new_password)).ToString();
                if (giatri == "1")
                {
                    giatri = tbAccount.Change_Password(Convert.ToInt32(Session["Session_User"].ToString()), Utils.GetMD5Hash(old_password), Utils.GetMD5Hash(new_password)).ToString();
                    string[] session_temp = new string[3];
                    session_temp[0] = "";
                    session_temp[1] = "";
                    session_temp[2] = "";
                    this.Session["Temp_User"] = session_temp;
                    ViewData["success"] = "Hệ thống đã thay đổi mật khẩu thành công";
                }
                else
                {

                     ViewData["error"] = "Bạn đã nhập sai mật khẩu";
                   
                }
            }

            return View();
          
        }
        
        // check validate and update new pass in database
        public ActionResult JsonCheckChangePassword(string old_password, string new_password)
        {
            UsersModel tbAccount = new UsersModel();
            Utils md5 = new Utils();
            if (Session["Session_User"] != null)
            {
                string giatri;
                giatri = tbAccount.Check_Change_Password(Convert.ToInt32(Session["Session_User"].ToString()), Utils.GetMD5Hash(old_password), Utils.GetMD5Hash(new_password)).ToString();
               
                return Content(giatri);  
            }
            return Content("-1");
        }
       
        // view forget password
        public ActionResult forgetpassword()
        {
            if (Session["Session_User"] != null)
            {
                // chuyen den trang logon
                Response.Redirect("/home/index");
            }
            if (this.Request.Form.Count != 0)
            {
                UsersModel tbAccount = new UsersModel();
                string username = Server.HtmlEncode(this.Request.Form["username"]);
                string email = Server.HtmlEncode(this.Request.Form["email"]);
              
                Random ran = new Random();
                Utils md5 = new Utils();
               
                int n = 10000000;
                string value = ran.Next(n).ToString();
                while (value.Length < 6)
                {
                    value = ran.Next(n).ToString();
                }
                string giatri = "";
                giatri = tbAccount.Check_User_Email(username, email).ToString();
                if (giatri == "1")
                {
                    tbAccount.Change_Pass(username, Utils.GetMD5Hash(value));
                    string[] session_temp = new string[3];
                    session_temp[0] = username;
                    session_temp[1] = value;
                    session_temp[2] = email;
                    this.Session["Temp_User"] = session_temp;
                    Response.Redirect("/account/success?method=forget");
                }
                else
                {
                    ViewData["error"] = "Bạn đã nhập sai Tên Đăng Nhập hoặc Email";
                }
               
            }
            return View();
        }
       
        // check validate and update new pass in database
        
    }
}
